import cv2 as cv
import numpy as np 

# 读取原始载体图像
img = cv.imread("/home/heron/Desktop/linux_notes/python/img/pic001.png",0)
r,c = img.shape
# 原图
cv.imshow("img",img)
cv.waitKey()
cv.destroyAllWindows()

# 生成掩码区域,假设为脸部信息
mask = np.zeros((r,c),dtype = np.uint8)
mask[220:400,250:350] =1


# 获取一个key，打码和解码所使用的秘钥
key = np.random.randint(0,256,size=[r,c],dtype=np.uint8)

# ==============获取打码脸========================

# 对整张图进行加密
imgXorKey = cv.bitwise_xor(img , key)
cv.imshow("imgXorKey",imgXorKey)
cv.waitKey()
cv.destroyAllWindows()


# 获取加密图像的脸部信息encryptFace，脸部区域不变，非脸部信区域颜色全黑
encryptFace = cv.bitwise_and(imgXorKey,mask*255)
cv.imshow("encryptFace",encryptFace)
cv.waitKey()
cv.destroyAllWindows()

# 将图像img内的脸部值设为0，即：黑色， 得到 noface1
# 非脸部区域和255做位与运算，即非脸部不变，而脸部区域变成0，全黑
noface1= cv.bitwise_and(img,(1-mask)*255)
cv.imshow("noface1",noface1)
cv.waitKey()


# 得到脸部打码的img图像，，
# encryptFace表示加密的脸部区域，而其他区域全0，nofance1 表示 脸部区域为0，非脸部区域是原样
# 相加得出结果就是只有脸部区域加密的（也就是加码），而其他区域正常的的图像
maskFace = encryptFace + noface1
cv.imshow("maskFace",maskFace)
cv.waitKey()
cv.destroyAllWindows()

# ===================将打码脸解码 =====================

# 将脸部打码的img 与秘钥key进行异或运算得到脸部的原始信息，
# 但是非脸部会进行打码加密
extractOriginal =cv.bitwise_xor(maskFace,key)
cv.imshow("extractOriginal",extractOriginal)
cv.waitKey()
cv.destroyAllWindows()

#将解吗的脸部信息extractOriginal提取出来，得到 extractFace 
# 非脸部为0，即全黑
extractFace = cv.bitwise_and(extractOriginal,mask*255)
cv.imshow("extractFace",extractFace)
cv.waitKey()
cv.destroyAllWindows()

# 从脸部打码的img内提取没有脸部信息的img图像，得到noFace2
#脸部信息为0，其他区域正常
noface2 = cv.bitwise_and(maskFace,(1-mask)*255)
cv.imshow("noface2",noface2)
cv.waitKey()
cv.destroyAllWindows()


# 得到解码的最终解码的img图像
extractImg = noface2 + extractFace
cv.imshow("extractImg",extractImg)
cv.waitKey()
cv.destroyAllWindows()

